# language: zh-CN
# 需求ID: REQ-004
# SRS需求: 3.2 两层转换架构, 4.1 多数据库支持
# Feature ID: Epic 2.2
# 用户故事: US-012, US-013, US-014
功能: ORM集成
  作为开发者
  我希望DSL能够无缝集成主流ORM框架
  以便利用现有的ORM生态和工具链

  背景:
    假设我是一个使用ORM框架的开发者
    并且我希望在现有项目中集成DSL能力
    并且我不想放弃现有的ORM投资
    并且系统已经支持数据库适配器

  # US-012: 作为开发者，我希望DSL能够集成TypeORM
  场景: 集成TypeORM框架
    假设我的项目使用TypeORM作为ORM框架
    假设我使用YAML DSL定义了用户实体:
      """
      entities:
        User:
          fields:
            id: { type: uuid, primary: true }
            email: { type: string, required: true, unique: true }
            name: { type: string, required: true }
            createdAt: { type: datetime, auto: true }
            updatedAt: { type: datetime, auto: true }
          
          relationships:
            profile:
              type: hasOne
              target: UserProfile
              foreignKey: userId
      """
    当我配置ORM集成为TypeORM:
      """
      orm:
        provider: typeorm
        config:
          type: postgres
          host: localhost
          port: 5432
          database: test_db
          synchronize: true
          logging: true
      """
    那么系统应该生成对应的TypeORM实体类
    并且应该包含正确的装饰器（@Entity, @Column, @PrimaryGeneratedColumn等）
    并且应该包含正确的关系映射（@OneToOne, @ManyToOne等）
    并且应该支持TypeORM的Repository模式
    并且应该支持TypeORM的查询构建器
    并且应该保持与原生TypeORM的完全兼容性

  # US-013: 作为开发者，我希望DSL能够集成Prisma
  场景: 集成Prisma框架
    假设我的项目使用Prisma作为ORM框架
    假设我使用相同的YAML DSL定义
    当我配置ORM集成为Prisma:
      """
      orm:
        provider: prisma
        config:
          datasource:
            provider: postgresql
            url: env("DATABASE_URL")
          generator:
            provider: prisma-client-js
            output: ./generated/prisma-client
      """
    那么系统应该生成对应的Prisma schema文件
    并且应该包含正确的模型定义
    并且应该包含正确的关系定义（@relation）
    并且应该支持Prisma Client的类型安全查询
    并且应该支持Prisma的迁移工具
    并且应该保持与原生Prisma的完全兼容性

  # US-014: 作为开发者，我希望能够在运行时动态切换ORM实现
  场景: 动态切换ORM实现
    假设我需要在不同环境使用不同的ORM
    假设我定义了统一的DSL模型
    当我在运行时配置不同的ORM提供者:
      """
      // 开发环境使用TypeORM
      const devConfig = {
        orm: {
          provider: 'typeorm',
          config: { /* TypeORM配置 */ }
        }
      };
      
      // 生产环境使用Prisma
      const prodConfig = {
        orm: {
          provider: 'prisma',
          config: { /* Prisma配置 */ }
        }
      };
      
      // 动态初始化
      const orm = await ORMFactory.create(config.orm);
      const userRepository = orm.getRepository('User');
      """
    那么系统应该支持运行时ORM切换
    并且应该提供统一的Repository接口
    并且应该保持相同的API调用方式
    并且应该正确处理不同ORM的特性差异
    并且应该支持事务的统一管理
    并且应该支持连接池的统一配置

  场景: ORM特性映射和兼容性处理
    假设我使用了DSL的高级特性
    假设我定义了以下复杂模型:
      """
      entities:
        Order:
          fields:
            id: { type: uuid, primary: true }
            status: { type: enum, values: [pending, confirmed, shipped] }
            items: { type: json }
            metadata: { type: jsonb }
            total: { type: decimal, precision: 10, scale: 2 }
          
          indexes:
            - fields: [status, createdAt]
              type: btree
            - fields: [metadata]
              type: gin
          
          constraints:
            - type: check
              condition: "total >= 0"
      """
    当我使用不同的ORM提供者时
    那么系统应该正确映射数据类型
    并且应该处理ORM特有的特性（如Prisma的@map, TypeORM的@Index）
    并且应该在不支持的特性上给出警告
    并且应该提供特性兼容性报告
    并且应该支持ORM特定的优化配置

  场景: 查询接口的统一抽象
    假设我需要执行复杂查询
    当我使用统一的查询接口:
      """
      // 统一的查询接口
      const users = await userRepository.find({
        where: {
          status: 'active',
          createdAt: { gte: new Date('2024-01-01') }
        },
        include: {
          profile: true,
          orders: {
            where: { status: 'confirmed' },
            orderBy: { createdAt: 'desc' }
          }
        },
        orderBy: { name: 'asc' },
        take: 10,
        skip: 0
      });
      """
    那么系统应该将查询转换为对应ORM的原生查询
    并且应该保持查询结果的一致性
    并且应该支持复杂的关联查询
    并且应该支持分页和排序
    并且应该支持事务中的查询执行
    并且应该提供查询性能分析